﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotas.Core;

namespace GestorDeFlotasDesktop.RegistrarViaje
{
    public partial class RegistrarViajes : Form
    {
        public RegistrarViajes()
        {
            InitializeComponent();
        }

        private Turno MyTurno { get; set; }
        private Cliente MyCliente { get; set; }
        private Chofer MyChofer { get; set; }

        private void RegistrarViajes_Load(object sender, EventArgs e)
        {
            cboTipoViaje.SelectedIndex = 0;
        }

        private void cboTipoViaje_SelectedIndexChanged(object sender, EventArgs e)
        {
            switch (cboTipoViaje.SelectedIndex)
            {
                case 0:
                    this.btnCliente.Enabled = true;
                    break;
                case 1:
                    this.btnCliente.Enabled = false;
                    this.txtCliente.Text = string.Empty;
                    this.MyCliente = null;
                    break;
                default:
                    break;
            }
        }

        private void btnChofer_Click(object sender, EventArgs e)
        {
            AbmChofer.AbmChofer abmChofer = new AbmChofer.AbmChofer(ModoAbm.Consulta);
            if (abmChofer.ShowDialog() == DialogResult.OK && abmChofer.MyChofer != null)
            {
                this.MyChofer = abmChofer.MyChofer.Cargar();
                this.txtChofer.Text = string.Format("{0} {1}", this.MyChofer.Nombre, this.MyChofer.Apellido);
            }
        }

        private void btnTurno_Click(object sender, EventArgs e)
        {
            AbmTurno.AbmTurno abmTurno = new AbmTurno.AbmTurno(ModoAbm.Consulta);
            if (abmTurno.ShowDialog() == DialogResult.OK && abmTurno.MyTurno != null)
            {
                this.MyTurno = abmTurno.MyTurno.Cargar();
                this.txtTurno.Text = this.MyTurno.Descripcion;
            }
        }

        private void btnCliente_Click(object sender, EventArgs e)
        {
            AbmCliente.AbmCliente abmCliente = new AbmCliente.AbmCliente(ModoAbm.Consulta);
            if (abmCliente.ShowDialog() == DialogResult.OK && abmCliente.MyCliente != null)
            {
                this.MyCliente = abmCliente.MyCliente.Cargar();
                this.txtCliente.Text = string.Format("{0} {1}", this.MyCliente.Nombre, this.MyCliente.Apellido);
            }
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            List<string> camposInvalidos = ChequearCamposObligatorios();
            if (ValidarHoraSegunTurno())
            {
                if (!(camposInvalidos.Count > 0))
                {
                    Viaje viaje = new Viaje();
                    viaje.Chofer = this.MyChofer;
                    viaje.Cliente = this.MyCliente;
                    viaje.FechaHora = this.dtpFecha.Value.Date + this.dtpHora.Value.TimeOfDay;
                    viaje.Fichas = Convert.ToInt32(this.mtxFichas.Text);
                    viaje.Turno = this.MyTurno;

                    try
                    {
                        viaje.Registrar();
                        MessageBox.Show("El viaje ha sido registrado exitosamente.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        LimpiarControles();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                else
                {
                    MostrarMensajeCamposObligatorios(camposInvalidos);
                }
            }            
        }

        private bool ValidarHoraSegunTurno()
        {
            if (!this.MyTurno.EstaEntreHorasTurno(this.dtpHora.Value))
            {
                MessageBox.Show("La hora ingresada no corresponde al turno seleccionado.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return false;
            }

            return true;
        }

        private void LimpiarControles()
        {
            this.MyCliente = null;
            this.MyTurno = null;
            this.MyChofer = null;

            this.txtChofer.Text = string.Empty;
            this.txtCliente.Text = string.Empty;
            this.txtTurno.Text = string.Empty;
            this.mtxFichas.Text = string.Empty;
            this.dtpFecha.Text = string.Empty;
            this.dtpHora.Text = string.Empty;
        }

        private List<string> ChequearCamposObligatorios()
        {
            List<string> camposInvalidos = new List<string>();
            if (string.IsNullOrEmpty(this.txtChofer.Text))
            {
                camposInvalidos.Add("Chofer");
            }

            if (string.IsNullOrEmpty(this.txtTurno.Text))
            {
                camposInvalidos.Add("Turno");
            }

            if (string.IsNullOrEmpty(this.mtxFichas.Text))
            {
                camposInvalidos.Add("Fichas");
            }

            if (string.IsNullOrEmpty(this.dtpFecha.Text))
            {
                camposInvalidos.Add("Fecha");
            }

            if (string.IsNullOrEmpty(this.dtpHora.Text))
            {
                camposInvalidos.Add("Hora");
            }

            if (string.IsNullOrEmpty(this.txtCliente.Text) && this.cboTipoViaje.Text == "Cliente")
            {
                camposInvalidos.Add("Cliente");
            }

            return camposInvalidos;
        }

        protected void MostrarMensajeCamposObligatorios(List<string> camposInvalidos)
        {
            MessageBox.Show(string.Format("Los siguientes campos son obligatorios:{0}{1}", Environment.NewLine,
                string.Join(string.Format(",{0}", Environment.NewLine), camposInvalidos.ToArray())),
                "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
    }
}
